package com.study.pattern.strategy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.study.pattern.IStep;

public class Step2 implements IStep {

	final Logger logger = LoggerFactory.getLogger(this.getClass());

	/*	
	 * 공통된 부분과 달라지는 부분을 구분하여 달라지는 부분의 알고리즘을 따로 분리 한다.	
	 * 오리의 나는 부분관 우는 부분은 달라 질수 있으므로 따로 뺀다.
	 * 상속 보다는 구성(interface등)을 이용하는것이 좋다? 알고리즘을 중간에 바꿀수 있어서?
	 * 
	 * Strategy Pattern
	 * 알고리즘군을 정의하고 각각을 캡슐화 하여 바꿔 쓸수 있게 만든다.
	 * 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.
	 * 
	 */
	@Override
	public void excute() {
	}

	
	private interface IFly {
		public void fly();
	}
	
	private class MallardDuckFly implements IFly{
		@Override
		public void fly() {
			logger.debug("천둥오리 ");
		}
	}
	
	public interface IQuack {
		public void quack();
	}
	
	private abstract class Duck{
		IFly fly;
		IQuack quack;
		public void setFly(IFly fly) {this.fly = fly;}
		public void setQuack(IQuack quack) {this.quack = quack;}
		public void performFly(){fly.fly();};
		public void performQuack(){quack.quack();};
		public void swim(){
			logger.debug("수영을 할줄 알아요.");
		};
		public abstract void display();
	}

	/* 천둥오리 */
	class MallardDuck extends Duck{
		public MallardDuck(){
			this.setFly(new MallardDuckFly());
		}
		public void display(){
			logger.debug("천둥오리처럼 생겼어요.");
		};
	}

	class RedheadDuck extends Duck{
		public void display(){
			logger.debug("빨간머리 오리처럼 생겼어요.");
		};
	}

	class RubberDuck extends Duck{
		/* 	*/
		public void display(){
			logger.debug("고무오리처럼 생겼어요.");
		};
	}

	class DecoyDuck extends Duck{
		/*  */
		public void display(){
			logger.debug("모형오리처럼 생겼어요.");
		};
	}
}
